﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Net;

namespace Server
{

    public class CConfig
    {
        #region Bien
        private const string _pathconfig = "./Config/config.ini";
        private int _port = 21212;
        private string _ip = "127.0.0.1";
        private string _hostserver = "localhost";
        private string _name = "";
        private string _pass = "";

        public string Pass
        {
            get { return _pass; }
            set { _pass = value; }
        }

        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
        /// <summary>
        /// Khới tạo file các cấu hình cho hệ thống
        /// </summary>
        public CConfig()
        {
            //Lấy thông tin cấu hình từ file "config"
            DocFileConfig();
        }


        public string Pathconfig
        {
            get
            {
                return _pathconfig;
            }
        }
        public int Port
        {
            get { return _port; }
            set { _port = value; }
        }
        public string Ip
        {
            get { return _ip; }
            set { _ip = value; }
        }
        public string Hostserver
        {
            get { return _hostserver; }
            set { _hostserver = value; }
        }
        #endregion

        #region "Hàm"
        /// <summary>
        /// Đọc thông tin từ file config
        /// </summary>
        private void DocFileConfig()
        {
            try
            {
                //Kiểm tra file config có tồn tại hay không?
                if (File.Exists(_pathconfig))
                {
                    //Mở file và chuẩn bị đọc file
                    StreamReader rd = new StreamReader(File.Open(_pathconfig, FileMode.Open));

                    //Duyệt từng dòng trong file config
                    while (!rd.EndOfStream)
                    {
                        //Đọc từng dòng
                        string str = rd.ReadLine();
                        //Splip chuỗi
                        string[] arr = str.Split(new char[] { '=' }, StringSplitOptions.RemoveEmptyEntries);
                        //Kiểm tra định dạng file config
                        if (arr.Length == 2)
                        {
                            try
                            {
                                //Phân tích từng dòng
                                switch (arr[0].Trim())
                                {
                                    case "ip":
                                        Ip = IPAddress.Parse(arr[1].Trim()).ToString();
                                        break;
                                    case "port":
                                        Port = int.Parse(arr[1].Trim());
                                        break;
                                    case "name":
                                        Name = arr[1].Trim();
                                        break;
                                    case "pass":
                                        Pass = arr[1].Trim();
                                        break;
                                    case "hostnameserver":
                                        IPAddress[] ip = Dns.GetHostAddresses(arr[1].Trim());
                                        if (ip.Length == 0)
                                        {
                                            throw new Exception("Định dạnh file config không đúng");
                                        }
                                        else
                                        {
                                            Hostserver = arr[1].Trim();
                                        }
                                        break;
                                    default:
                                        break;
                                }
                            }
                            catch (Exception c)
                            {
                                throw new Exception("Định dạnh file config không đúng");
                            }
                        }
                        else
                        {
                            throw new Exception("Định dạnh file config không đúng");
                        }
                    }

                    rd.Close();
                }
                else
                {
                    //File config.ini không tìm thấy
                    throw new Exception("Không tìm thấy file config");
                }
            }
            catch (Exception c)
            {
                throw new Exception(c.Message);
            }
        }
        /// <summary>
        /// Config Server
        /// </summary>
        /// <param name="port"></param>
        public void GhiFileConfig(int port)
        {
            try
            {
                //Kiểm tra file config có tồn tại hay không?
                if (File.Exists(_pathconfig))
                {
                    File.Delete(_pathconfig);
                }

                StreamWriter _writer = new StreamWriter(File.Create(_pathconfig));

                string config = "#NAME = VALUE" + "\nport = " + port.ToString();
                _writer.WriteLine(config);
                _writer.Flush();

                _writer.Close();
            }
            catch (Exception c)
            {
                throw new Exception(c.Message);
            }
        }
        /// <summary>
        /// Config Client
        /// </summary>
        /// <param name="ip"></param>
        /// <param name="hostnameserver"></param>
        /// <param name="port"></param>
        public void GhiFileConfig(string ip, string hostnameserver, int port)
        {
            try
            {
                //Kiểm tra file config có tồn tại hay không?
                if (File.Exists(_pathconfig))
                {
                    File.Delete(_pathconfig);
                }
                StreamWriter _writer = new StreamWriter(File.Create(_pathconfig));

                string config = "#NAME = VALUE"
                    + "\nip = " + ip
                    + "\nport = " + port
                    + "\nhostnameserver = " + hostnameserver
                    + "\nname = " + Name
                    + "\npass = " + Pass;
                _writer.WriteLine(config);
                _writer.Flush();

                _writer.Close();
            }
            catch (Exception c)
            {
                throw new Exception(c.Message);
            }
        }

        public void GhiFileConfig(string user, string pass)
        {
            try
            {
                //Kiểm tra file config có tồn tại hay không?
                if (File.Exists(_pathconfig))
                {
                    File.Delete(_pathconfig);
                }

                StreamWriter _writer = new StreamWriter(File.Create(_pathconfig));

                string config = "#NAME = VALUE"
                    + "\nip = " + Ip
                    + "\nport = " + Port
                    + "\nhostnameserver = " + Hostserver
                    + "\nname = " + user
                    + "\npass = " + pass;
                _writer.WriteLine(config);
                _writer.Flush();

                _writer.Close();
            }
            catch (Exception c)
            {
                throw new Exception(c.Message);
            }
        }
        #endregion

    }
}
